/*
  This file is part of JCM.

  JCM is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  JCM is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with JCM.  If not, see <http://www.gnu.org/licenses/>.
*/
import java.awt.*;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JWindow;

/**
 * Window especializada como splash screen.
*/
public class SplashWindow extends JWindow
{
  /** Imagem splash opcionalmente transparente carregada como resource. */
  private Image splashImage;

  /** Imagem de fundo resultante da captura de porção do screen. */
  private Image bgImage;

  /**
   * Constrói e exibe uma window que usa uma imagem splash carregada
   * como resource tal como feito pelo SplashScreen do JRE6.
   *
   * @param filename Nome do arquivo resource que contém a imagem.
  */
  public SplashWindow(String filename)
  {
    // obtêm a imagem de splash como resource
    try {
      splashImage = ImageIO.read(
        getClass().getClassLoader().getResource(filename));
    } catch (IOException e) {
      System.err.println(e);
    }

    // obtêm a dimensão dessa window
    Dimension splashSize = new Dimension(
      splashImage.getWidth(this), splashImage.getHeight(this));

    // calcula a posição de splash
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    Point where = new Point(
      (screenSize.width - splashSize.width) / 2,
      (screenSize.height - splashSize.height) / 2);

    // captura a imagem de fundo
    try {
      Robot r = new Robot();
      bgImage = r.createScreenCapture(new Rectangle(where, splashSize));
    } catch (AWTException e) {
      e.printStackTrace();
    }

    // declara a dimensão default dessa window
    setPreferredSize(splashSize);

    pack();

    // centraliza a window
    setLocation(where);

    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

    setVisible(true);
  }

  /**
   * Renderiza a window com a imagem splash sobreposta à imagem de fundo
   * capturada com a mesma dimensão.
   *
   * @param g O Canvas objeto da renderização.
  */
  @Override public void paint(Graphics g)
  {
    Graphics2D g2d = (Graphics2D) g;
    // renderiza a imagem de fundo
    g2d.drawImage(bgImage, 0, 0, this);
    // renderiza a imagem de splash
    g2d.drawImage(splashImage, 0, 0, this);
  }

  public static final long serialVersionUID = 3430634518074553043L;
}
